package com.zhouyou.http.model.utils;

import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;

import java.security.Key;

import java.security.spec.AlgorithmParameterSpec;

import java.util.Locale;

import javax.crypto.Cipher;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

/**
 * Created by Administrator on 2016/8/16 0016.
 */
public class DESUtil {
    public static final String ALGORITHM_DES = "AES/GCM/NoPadding";


    /**
     * DES算法，加密
     *
     * @param data 待加密字符串
     * @param key  加密私钥，长度不能够小于8位
     * @return 加密后的字节数组，一般结合Base64编码使用
     * @throws InvalidAlgorithmParameterException
     * @throws Exception
     */

    public static String encode(String key, String data) {

        if (data == null)

            return null;

        try {

            DESKeySpec dks = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

// key的长度不能够小于8位字节

            Key secretKey = keyFactory.generateSecret(dks);

            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes(StandardCharsets.UTF_8));

            AlgorithmParameterSpec paramSpec = iv;

            cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);

            byte[] bytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));

            return byte2String(bytes);

        } catch (Exception e) {

            e.printStackTrace();

            return data;

        }

    }


    /**
     * DES算法，解密
     *
     * @param data 待解密字符串
     * @param key  解密私钥，长度不能够小于8位
     * @return 解密后的字节数组
     * @throws Exception 异常
     */

    public static String decode(String key, String data) {

        if (data == null)

            return null;

        try {

            DESKeySpec dks = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

// key的长度不能够小于8位字节

            Key secretKey = keyFactory.generateSecret(dks);

            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes(StandardCharsets.UTF_8));

            AlgorithmParameterSpec paramSpec = iv;

            cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);

            return new String(cipher.doFinal(byte2hex(data.getBytes(StandardCharsets.UTF_8))), StandardCharsets.UTF_8);

        } catch (Exception e) {

            e.printStackTrace();

            return data;

        }

    }


    /**
     * 二行制转字符串
     *
     * @param b
     * @return
     */

    private static String byte2String(byte[] b) {

        StringBuilder hs = new StringBuilder();

        String stmp;

        for (int n = 0; b != null && n < b.length; n++) {

            stmp = Integer.toHexString(b[n] & 0XFF);

            if (stmp.length() == 1)

                hs.append('0');

            hs.append(stmp);

        }

        return hs.toString().toUpperCase(Locale.CHINA);

    }


    /**
     * 二进制转化成16进制
     *
     * @param b
     * @return
     */

    private static byte[] byte2hex(byte[] b) {

        if ((b.length % 2) != 0)

            throw new IllegalArgumentException();

        byte[] b2 = new byte[b.length / 2];

        for (int n = 0; n < b.length; n += 2) {

            String item = new String(b, n, 2,StandardCharsets.UTF_8);

            b2[n / 2] = (byte) Integer.parseInt(item, 16);

        }

        return b2;

    }
}
